liveview 서버에서 liveview JS 사용하기

서버측에서 클라이언트단 이벤트를 호출하여 Liveview.JS를 실행시키기

컴포넌트단

attr(:show, :boolean, default: false)

<div
	id={@id}
	phx-mounted={@show && JS.exec("phx-show", to: "##{@id}")}
	phx-show={show(@id)}
	phx-hide={hide(@id)}
	class="fixed inset-0 max-h-screen max-w-screen backdrop-blur-dimm z-50 ease-in-out duration-100 hidden group/overlay"
	data-view-state={@view_state}
>
# ...


def show(js \\ %JS{}, id) when is_binary(id) do
 js
 |> JS.set_attribute({"data-view-state", "open"}, to: "##{id}")
 |> JS.show(to: "##{id}", transition: {"_", "_", "_"}, time: 100)
 |> JS.add_class("overflow-hidden", to: "body")
 |> JS.focus_first(to: "##{id}")
end

def hide(js \\ %JS{}, id) do
 js
 |> JS.set_attribute({"data-view-state", "closed"}, to: "##{id}")
 |> JS.hide(to: "##{id}", transition: {"_", "_", "_"}, time: 100)
 |> JS.remove_class("overflow-hidden", to: "body")
 |> JS.pop_focus()
end

서버단


socket
 |> assign(room: room)
 |> push_event("js-exec", %{
	to: "#room-name-change-modal",
	attr: "phx-hide"
 })
          

assets의 app.ts에 아래 이벤트 추가

window.addEventListener("phx:js-exec", ({ detail }: any) => {
  document.querySelectorAll(detail.to).forEach((el) => {
    window.liveSocket?.execJS(el, el.getAttribute(detail.attr));
  });
});

이제 js-exec로 모든 liveview JS를 실행 가능하다.
\